package com.ht.modules.system.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import com.ht.modules.system.entity.SysUser;
import com.ht.modules.system.entity.SysUserVo;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 用户表 Mapper 接口
 * </p>
 *
 *
 * @since 2018-12-20
 */
public interface SysUserMapper extends BaseMapper<SysUser> {

    /**
     * 通过用户账号查询用户信息
     *
     * @param username 用户账号
     * @return 用户信息
     */
    SysUser getUserByName(@Param("username") String username);

    /**
     * 根据部门Id查询用户信息
     *
     * @param departId 部门id
     * @param username 用户账号
     * @return 用户信息IPage
     */
    List<SysUserVo> getUserByDepId(Page page, @Param("departId") String departId, @Param("username") String username);

    /**
     * 根据角色Id查询用户信息
     *
     * @param roleId   角色id
     * @param username 用户账号
     * @return 用户信息IPage
     */
    IPage<SysUser> getUserByRoleId(Page page, @Param("roleId") String roleId, @Param("username") String username);

    /**
     * 根据用户名设置部门ID
     *
     * @param username 用户账号
     * @param orgCode  部门编号
     */
    void updateUserDepart(@Param("username") String username, @Param("orgCode") String orgCode);

    /**
     * 用户管理列表
     *
     * @param userVo 筛选条件
     * @param column 排序列
     * @param order  排序方式
     * @return 用户信息List
     */
    List<SysUserVo> list(Page<SysUserVo> page, @Param("userVo") SysUserVo userVo,
                         @Param("column") String column, @Param("order") String order);

    /**
     * 用户管理列表
     *
     * @param userVo 筛选条件
     * @param column 排序列
     * @param order  排序方式
     * @return 用户信息List
     */
    List<SysUserVo> list(@Param("userVo") SysUserVo userVo, @Param("column") String column, @Param("order") String order);

    /**
     * 根据部门id获取用户信息Vo
     *
     * @param depId    部门id
     * @param username 用户账号
     * @param realname 真实姓名
     * @return 用户信息List
     */
    List<SysUserVo> queryUserVoByDepId(@Param("depId") String depId, @Param("username") String username,
                                       @Param("realname") String realname);

    /**
     * 根据用户id返回其所在部门id
     *
     * @param applyUserId 用户id
     * @return 部门id
     */
    String getDepartIdByUserId(@Param("applyUserId") String applyUserId);

    /**
     * 根据用户username获取用户所在部门的部门经理username
     *
     * @param applyUserId 用户username
     * @return 部门经理username的List<String>
     */
    List<String> getDepartmentHead(@Param("applyUserId") String applyUserId);

    /**
     * 根据角色code获取对应用户username
     *
     * @param roleCode 角色code
     * @return 对应角色username的List<String>
     */
    List<String> getUsernameByRoleCode(@Param("roleCode") String roleCode);

    /**
     * 根据用户账号的list获取cid
     *
     * @param usernameList 用户账号list
     * @return cid的list
     */
    List<String> getCidListByUsername(@Param("usernameList") List<String> usernameList);

    /**
     * 根据用户账号获取cid
     *
     * @param username 用户账号
     * @return 用户对应cid
     */
    String getCidByUsername(@Param("username") String username);

    /**
     * 根据角色code获取cid
     *
     * @param roleCode 角色code
     * @return cid的list
     */
    List<String> getCidListByRoleCode(@Param("roleCode") String roleCode);

    /**
     * 根据用户id更新cid
     *
     * @param userId 用户id
     * @param cid    最新的cid
     */
    void updateCidById(@Param("userId") String userId, @Param("cid") String cid);

    /**
     * 根据用户id获取用户详细信息
     *
     * @param id 用户id
     */
    SysUserVo queryById(@Param("id") String id);

    String getUsernameByRole(@Param("roleList") String[] roleList);

    /**
     * 根据角色编码查询用户列表
     *
     * @param roleCode 角色编码
     */
    List<SysUser> listUserByRoleCode(@Param("roleCode") String roleCode);

    /**
     * 根据用户id修改人员状态
     *
     * @param personState     新的人员状态
     * @param userId          用户id
     * @param sysUserUsername 更新人账号
     * @return 修改影响条数
     */
    int updatePersonState(@Param("personState") String personState, @Param("userId") String userId,
                          @Param("sysUserUsername") String sysUserUsername);

    /**
     * 获取未冻结的用户id、姓名、角色
     *
     * @return 未冻结的用户id、姓名、角色
     */
    List<Map<String, String>> getUserWithRole();

    /**
     * 根据角色编码获取对应员工信息
     *
     * @param roleCode 编码
     * @return 用户信息
     */
    List<SysUser> getUsersByRoleCode(@Param("roleCode") String roleCode);

    /**
     * 根据角色编码和部门信息获取对应领导信息
     *
     * @param roleCode 编码
     * @return 用户信息
     */
    List<SysUser> getLeaderByRoleCodeAndDepartId(@Param("roleCode") String roleCode, @Param("departId") String departId);

    /**
     * 根据用户ID获取对应角色
     *
     * @param userId 用户ID
     * @return 用户信息
     */
    List<String> getRoleCodeByUserId(@Param("userId") String userId);
}
